//! 高级功能演示程序
//! 
//! 展示基于Rust+Arrow Flight SQL+微内核架构的数据网关系统的高级功能：
//! 1. GraphQL查询处理器
//! 2. REST API查询处理器
//! 3. MongoDB数据源插件
//! 4. 多查询引擎统一接口

use std::collections::HashMap;
use data_gateway_kernel::{DataGatewayKernel, Query};
use data_gateway_query_engine::{
    GraphQLParser, GraphQLExecutor, GraphQLContext, MemoryGraphQLDataSource,
    RestRouter, RestRequest, HttpMethod, MemoryRestDataSource
};
use data_gateway_data_sources::{MongoDBDataSource, MongoDBConfig, DataSource};
use serde_json::json;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // 初始化日志
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        .init();

    println!("🚀 启动高级功能演示程序");
    println!("📋 展示GraphQL、REST API、MongoDB等高级功能");
    println!("");

    // ========== 第一部分：微内核系统初始化 ==========
    println!("🏗️  第一部分：微内核系统初始化");
    println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    
    let kernel = DataGatewayKernel::new().await?;
    println!("✅ 微内核系统初始化完成");

    // ========== 第二部分：GraphQL查询处理器演示 ==========
    println!("\n🔍 第二部分：GraphQL查询处理器演示");
    println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    
    // 创建GraphQL解析器和执行器
    let mut graphql_parser = GraphQLParser::new();
    let mut graphql_executor = GraphQLExecutor::new();
    
    // 注册内存数据源
    let memory_data_source = Box::new(MemoryGraphQLDataSource::new());
    graphql_executor.register_data_source("memory".to_string(), memory_data_source);
    
    println!("✅ GraphQL执行器初始化完成");

    // 测试简单查询
    let query_str = r#"
        query {
            users {
                id
                name
                email
            }
        }
    "#;
    
    println!("📊 执行GraphQL查询:");
    println!("   {}", query_str.trim());
    
    let query = graphql_parser.parse(query_str)?;
    let context = GraphQLContext {
        variables: HashMap::new(),
        request_info: HashMap::new(),
    };
    
    let result = graphql_executor.execute(query, context).await;
    
    if result.errors.is_empty() {
        println!("✅ GraphQL查询成功:");
        if let Some(data) = &result.data {
            println!("   数据: {}", serde_json::to_string_pretty(data)?);
        }
    } else {
        println!("❌ GraphQL查询失败:");
        for error in &result.errors {
            println!("   错误: {}", error.message);
        }
    }

    // 测试带参数的查询
    let query_str_with_args = r#"
        query {
            user(id: 1) {
                name
                email
                age
            }
        }
    "#;
    
    println!("\n📊 执行带参数的GraphQL查询:");
    println!("   {}", query_str_with_args.trim());
    
    let query = graphql_parser.parse(query_str_with_args)?;
    let context = GraphQLContext {
        variables: HashMap::new(),
        request_info: HashMap::new(),
    };
    
    let result = graphql_executor.execute(query, context).await;
    
    if result.errors.is_empty() {
        println!("✅ 带参数GraphQL查询成功:");
        if let Some(data) = &result.data {
            println!("   数据: {}", serde_json::to_string_pretty(data)?);
        }
    } else {
        println!("❌ 带参数GraphQL查询失败:");
        for error in &result.errors {
            println!("   错误: {}", error.message);
        }
    }

    // ========== 第三部分：REST API查询处理器演示 ==========
    println!("\n🌐 第三部分：REST API查询处理器演示");
    println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    
    // 创建REST路由器
    let mut rest_router = RestRouter::new();
    let memory_rest_source = Box::new(MemoryRestDataSource::new());
    rest_router.register_data_source("memory".to_string(), memory_rest_source);
    
    println!("✅ REST API路由器初始化完成");

    // 测试GET /api/users
    let get_users_request = RestRequest {
        method: HttpMethod::GET,
        path: "/api/users".to_string(),
        query_params: HashMap::new(),
        headers: HashMap::new(),
        body: None,
    };
    
    println!("📊 执行REST API请求: GET /api/users");
    let response = rest_router.handle_request(get_users_request).await?;
    println!("✅ REST API响应:");
    println!("   状态码: {}", response.status_code);
    println!("   数据: {}", serde_json::to_string_pretty(&response.body)?);

    // 测试GET /api/users/1
    let get_user_request = RestRequest {
        method: HttpMethod::GET,
        path: "/api/users/1".to_string(),
        query_params: HashMap::new(),
        headers: HashMap::new(),
        body: None,
    };
    
    println!("\n📊 执行REST API请求: GET /api/users/1");
    let response = rest_router.handle_request(get_user_request).await?;
    println!("✅ REST API响应:");
    println!("   状态码: {}", response.status_code);
    println!("   数据: {}", serde_json::to_string_pretty(&response.body)?);

    // 测试POST /api/users
    let post_user_request = RestRequest {
        method: HttpMethod::POST,
        path: "/api/users".to_string(),
        query_params: HashMap::new(),
        headers: HashMap::new(),
        body: Some(json!({
            "name": "新用户",
            "email": "newuser@example.com",
            "age": 28
        })),
    };
    
    println!("\n📊 执行REST API请求: POST /api/users");
    let response = rest_router.handle_request(post_user_request).await?;
    println!("✅ REST API响应:");
    println!("   状态码: {}", response.status_code);
    println!("   数据: {}", serde_json::to_string_pretty(&response.body)?);

    // ========== 第四部分：MongoDB数据源演示 ==========
    println!("\n🍃 第四部分：MongoDB数据源演示");
    println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    
    // 创建MongoDB数据源（不实际连接，只演示配置和SQL解析）
    let mongodb_config = MongoDBConfig {
        connection_string: "mongodb://localhost:27017".to_string(),
        database_name: "test_db".to_string(),
        connect_timeout_seconds: 30,
        query_timeout_seconds: 60,
        max_connections: 10,
    };
    
    let mongodb_source = MongoDBDataSource::new(mongodb_config);
    
    println!("✅ MongoDB数据源配置完成:");
    println!("   数据源名称: {}", mongodb_source.name());
    println!("   数据源描述: {}", mongodb_source.description());
    
    // 演示健康检查（未连接状态）
    let health = mongodb_source.health_check().await?;
    println!("📊 MongoDB健康检查:");
    println!("   状态: {}", serde_json::to_string_pretty(&health)?);

    // ========== 第五部分：统一查询接口演示 ==========
    println!("\n🔗 第五部分：统一查询接口演示");
    println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    
    // 创建不同类型的查询
    let sql_query = Query::sql("SELECT * FROM users WHERE age > 25".to_string());
    let script_query = Query::script("users.filter(u => u.age > 25)".to_string());
    
    println!("📊 创建统一查询接口:");
    println!("   SQL查询ID: {}", sql_query.id);
    println!("   SQL查询内容: {}", sql_query.content);
    println!("   脚本查询ID: {}", script_query.id);
    println!("   脚本查询内容: {}", script_query.content);

    // ========== 第六部分：系统总结 ==========
    println!("\n🎯 第六部分：系统总结");
    println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    
    println!("✨ 高级功能演示完成！");
    println!("");
    println!("🏆 已实现的高级功能:");
    println!("  ✅ GraphQL查询处理器 - 支持查询解析、执行和数据源路由");
    println!("  ✅ REST API查询处理器 - 支持RESTful API路由和HTTP方法处理");
    println!("  ✅ MongoDB数据源插件 - 支持SQL到MongoDB查询的转换");
    println!("  ✅ 多查询引擎统一接口 - 支持SQL、GraphQL、REST API统一访问");
    println!("");
    println!("🚀 技术优势:");
    println!("  ⚡ 多协议支持 - GraphQL、REST API、SQL统一接口");
    println!("  🔒 类型安全 - Rust编译时保证查询和数据类型安全");
    println!("  🌊 异步处理 - 基于Tokio的高性能异步查询处理");
    println!("  📊 NoSQL集成 - MongoDB等文档数据库的SQL映射支持");
    println!("  🔌 可扩展架构 - 支持自定义查询处理器和数据源插件");
    
    println!("\n🎉 高级功能演示程序成功完成！");
    println!("📚 更多信息请参考 plan1.md 中的详细技术方案");
    
    Ok(())
}
